/**
 * Gmini.js - Google Gemini API 调用模块
 * 这个模块提供了与Google Gemini API交互的功能，支持文本生成和处理
 * @module Gmini
 */

// 导入必要的依赖模块
const propertyChecker = require('../plugins/inTypeOf');  // 用于检查对象属性
const axios = require('axios');                         // 用于发送HTTP请求

// API密钥轮换计数器，用于在多个API密钥之间循环使用
let apiIndex = 0;

/**
 * 使用Google Gemini API生成内容的异步函数
 * @param {string} prompt - 输入的提示文本，用于生成内容
 * @returns {Promise<Object>} - 返回包含生成内容或错误信息的对象
 *                             成功时返回 {content: string, apiError: 'normal!', reqStatus: 'success'}
 *                             失败时返回 {reqStatus: string, error: string}
 */
async function generateContent(prompt) {
    // 验证请求参数
    if (!prompt || typeof prompt !== 'string') {
        return {
            reqStatus: 'error',
            error: 'Invalid input: prompt must be a non-empty string'
        };
    }

    // API密钥列表，用于轮换调用以避免单个密钥的请求限制
    const apiKeys = [
        'AIzaSyATivobv6PlkD-cnIJ8k1lgEuXk_t4AFxM',
        'AIzaSyCBCJqcFJPWfVnxmwv2kiDX1Mb7hLLYYew',
        'AIzaSyDiyqOVlm4ticaSmMwpuR1UteI43ytXvCY',
        'AIzaSyC8INbh50rAr5ZJQ1L22iA0pQs-QhHxSOI',
        'AIzaSyBS6tmfrFeLomXZPlBs7cczYEjzVFsHZVw',
        'AIzaSyBmx7fmSC8qU5kKQNsPbOhBn_94j4kyo6k',
        'AIzaSyBt2fCaVg7eZ6SYf1Rq422MKSENfZNy2go',
        'AIzaSyDSPDWVm8CYm83DJfZi8bH7efb2XBluEOU',
        'AIzaSyC8afxCESfdgXGzmnEhyBnCSwcIGt5OkCg',
        'AIzaSyB4qZJnusenRsaTKMF-r3hg_MX9U2UKxPI',
        'AIzaSyCLXD-5x5yEep-W93d93qXyAsA0gb5BPwQ',
        'AIzaSyDNRjXJzwlbeRKoAAcUz2srGDCU8L7RvJ8',
        'AIzaSyBeiyyjkhrntT7zKUfjNPLv1iSbh4mmUNE',
        'AIzaSyCmkGQmD-eUO7JjRbCAA7T83nVAYrISeco',
        'AIzaSyD86BbKiblVGeEXTj0zcJJJGrVi5trlerc',
        'AIzaSyA6ZnLjnvXBipaM6PxC9F4i069iQBoiiD4',
        'AIzaSyDTLZQPW7lD7rb5rgweqOwI65kkezcmN9Y',
        // 'AIzaSyA1S80z6-kUUM7ZJ5DVLUp4WzM2cE8b09E',
        'AIzaSyBITVzZ9nVjlBPwhoRYwdkmXxIvPezpHns',
        'AIzaSyAmMwpF0rJJRKZN05i-AC9PJrxCMnCfMI4',
        // 'AIzaSyB0NMsQI-xnYZhlIqtixATy2FJYZ7iLp6M'
    ];

    // 获取当前要使用的API密钥，并在到达列表末尾时重置索引
    if (apiIndex >= apiKeys.length) {
        apiIndex = 0;
    }
    const currentApiKey = apiKeys[apiIndex];

    // 配置API请求参数
    const requestConfig = {
        method: 'post',  // 使用POST方法发送请求
      url: 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=' + currentApiKey,
      headers: {
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/123.0.0.0 Safari/537.36',
        'Accept': '*/*',
        'Accept-Language': 'en-US,en;q=0.9',
        'Origin': 'https://generativelanguage.googleapis.com',
        'Referer': 'https://generativelanguage.googleapis.com/',
        
       },  // 设置请求头
        
      // ================测试看这里===============///
        proxy: {   //本地运行时候开启，服务器运行走全局就注释
            protocol: 'http',
            host: '127.0.0.1',
            port: 7890
      },
         // 明确使用 https 代理（用于 axios）
    // httpsAgent: new (require('https-proxy-agent'))('http://127.0.0.1:7890'),

        data: {
            generationConfig: {
                temperature: 1,          // 控制生成文本的随机性（0-1）
                topP: 0.95,             // 控制生成文本的多样性（0-1）
                topK: 40,               // 控制生成文本的质量（1-40）
                maxOutputTokens: 8192,   // 最大输出token数
                // responseMimeType: 'text/plain',  // 响应的MIME类型
            },
            contents: [{
                parts: [{ text: prompt }]  // 设置输入提示文本
            }],
        },
        timeout: 8000,  // 请求超时时间（毫秒）
    };

 

    try {
        // 记录当前使用的API密钥和请求详情
        // console.log('\n=== Request Details ===');
 console.log('=== End Request Details ===\n');

        // 发送API请求并等待响应
        const response = await axios.request(requestConfig);

        // 打印完整的响应信息用于调试
        // console.log('\n=== API Response Details ===');
        console.log('Status:',response.status);
        // console.log('Status Text:', response.statusText);
   

        // 如果响应数据中包含candidates，打印第一个候选内容
        if (response.data && response.data.candidates && response.data.candidates[0]) {
            // console.log('\n=== First Candidate Content ===');
     
        }

        // 定义需要检查的响应属性路径
        const propertyPaths = ['data','candidates','content','text'];

        // 检查响应是否包含所需属性
        if (propertyChecker.hasAnyRequiredProperties(response,propertyPaths)) {
            // 如果响应正常，返回处理后的内容
            const apiResponse = response.data.candidates[0].content;
            apiResponse.apiError = 'normal!';
            apiResponse.reqStatus = 'success';
            return apiResponse;
        } else {
            // 如果响应异常，返回错误信息
            const errorResponse = response;
            errorResponse.apiError = '接口请求未成功！请检查地址或网络!';
            console.log('result2:',errorResponse.status);
            errorResponse.reqStatus = 'error';
            return errorResponse;
        }

    } catch (error) {
        // 格式化错误信息
        let errorType = '未知错误';
        if (error instanceof TypeError) {
            errorType = '类型错误';
        } else if (error instanceof SyntaxError) {
            errorType = '语法错误';
        } else if (error instanceof Error) {
            errorType = 'API错误';
        }
        const errorMessage = `错误类型: ${errorType} - 错误信息: ${error.message || '未知错误'}`;
        console.error(errorMessage);

        // 处理请求错误
        // console.log('\n=== Error Details ===');
        const errorInfo = {};  //缓存不同错误情况的信息
        if (error.response) {
            // 服务器返回了错误响应（状态码不在2xx范围内）
            console.log('Error Response Status:',error.response.status);
            // console.log('Error Response Headers:', error.response.headers);
            errorInfo.reqStatus = 'ErrorResponse';
            errorInfo.error = error.response.data;
        } else if (error.request) {
            // 请求已发送但没有收到响应（可能是网络问题）
            console.log('Request was made but no response received');
            // console.log('Request Details:',error.request);
            errorInfo.reqStatus = 'ErrorRequest';
            errorInfo.error = 'No response received';
        } else {
            // 发生其他错误（如配置错误）
            console.log('Error Details:',error.message);
            // console.log('Error Config:',error.config);
            errorInfo.reqStatus = 'ErrorMessage';
            errorInfo.error = error.message;
        }

        // 打印完整的错误对象以便调试
        // console.log('Full Error Object:', error);
 
        return errorInfo;
    } finally {
        // 在请求完成后，自动轮换API密钥
        // apiIndex = (apiIndex + 1) % apiKeys.length;
        console.log('API Key Index:',apiIndex + 1);
        console.log('Request URL:',requestConfig.url);
        apiIndex++;
    }
}

// 导出generateContent函数供其他模块使用
module.exports = generateContent;